#ifndef _POLL_EVENT_LOOP_H
#define _POLL_EVENT_LOOP_H

#ifdef __cplusplus
extern "C" {
#endif

typedef enum _loop_event  loop_event_t;
enum _loop_event {
  EVENT_IN   =  1,
  EVENT_OUT  =  2,
  EVENT_ERR  =  4,
  EVENT_NVAL =  8/*output only*/
};

typedef struct _eloop      eloop_t;
typedef void (*io_handler_t)(eloop_t *eloop, int fd, loop_event_t event, void *data);

eloop_t* eloop_init(void);
void eloop_run(eloop_t *eloop);
/*
 * return source id
 */
int  eloop_add_io_source(eloop_t *eloop, int fd, loop_event_t events, io_handler_t handler, void *data);
/*
 * return source id
 */
int  eloop_add_timeout(eloop_t *eloop, int timeout, int (*timeoutcb)(eloop_t *eloop, void *data), void *data);
void eloop_add_run(eloop_t *eloop, void (*runcb)(eloop_t *eloop, void *data), void *data);
/*
 * find and removed return 0.
 */
int  eloop_remove_source(eloop_t *eloop, int id);
int  eloop_remove_timeout_by_cb(eloop_t *eloop, int (*timeoutcb)(eloop_t *eloop, void *data));
int  eloop_remove_io_source_by_fd(eloop_t *eloop, int fd);

#ifdef __cplusplus
}
#endif

#endif
